package com.yss.sofa.framework.services.report;

import java.io.File;
import java.io.Serializable;
import java.util.Map;

import com.yss.sofa.framework.services.Service;

/**
 * 报表组件提供的服务，供业务组件使用
 */
public interface ReportService extends Service{
	/**
	 * 返回报表的原始数据<br>
	 * 方法名拼写错误，使用execute方法替代
	 * @param code 报表编码
	 * @param params 报表需要的参数
	 * @return 原始数据
	 */
	@Deprecated
	public String[][] excute(String code,Map<String, String> params);
	/**
	 * 返回报表的原始数据<br>
	 * 适用于不分页的报表，或分页的报表只执行第一页，或只执行指定页（params.put("PAGE_INDEX","页码")，前提是你确定页码不会超出页数）
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值
	 * @return 原始数据，key=报表执行后的sheet名称
	 */
	public String[][] execute(String code,Map<String, String> params);
	/**
	 * 返回报表的原始数据<br>
	 * 适用于不分页的报表，或分页的报表只执行第一页，或只执行指定页（params.put("PAGE_INDEX","页码")，前提是你确定页码不会超出页数）
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值
	 * @return 报表，可通过此参数获取报表各项信息，已知的有（后续根据需要再新增新的key-value）：<br>
	 * 0，report=Serializable，报表对象<br>
	 * 1，code=Stirng，报表code<br>
	 * 2，name=String，报表名称<br>
	 * 3，raw=String[][]，报表主sheet（即sheet[main]的执行结果）所有单元格内容<br>
	 * 4，raws=Map<String,String[][]>，报表所有sheet的所有单元格内容<br>
	 * 5，row=Integer，报表主sheet（即sheet[main]的执行结果）行数<br>
	 * 6，rows=Map<String,Integer>，报表所有sheet的行数<br>
	 * 7，col=Integer，报表主sheet（即sheet[main]的执行结果）列数<br>
	 * 8，cols=Map<String,Integer>，报表所有sheet的列数<br>
	 * 9，title=Integer，报表主sheet（即sheet[main]的执行结果）表头行数<br>
	 * 10，titles=Map<String,Integer>，报表所有sheet的表头行数<br>
	 * 11，header=Integer，报表主sheet（即sheet[main]的执行结果）列头行数<br>
	 * 12，headers=Map<String,Integer>，报表所有sheet的列头行数<br>
	 * 13，detail=Integer，报表主sheet（即sheet[main]的执行结果）明细行数<br>
	 * 14，details=Map<String,Integer>，报表所有sheet的明细行数<br>
	 * 15，footer=Integer，报表主sheet（即sheet[main]的执行结果）表尾行数<br>
	 * 16，footers=Map<String,Integer>，报表所有sheet的表尾行数<br>
	 * 17，ranges=Integer[][]，报表主sheet（即sheet[main]的执行结果）的合并区域，第二维是Ingeter[4]，依次为合并区域的top、left、bottom、right<br>
	 * 18，multi-ranges=Map<String,Integer[][]>，报表所有sheet的合并区域<br>
	 * 19，excel=byte[]，excel文件<br>
	 * 20，params=Map<String,Serializable>，报表的类型化参数，可通过params.get("CONSTS")得到所有常量（Map<String,String>）<br>
	 * 21，rawparams=Map<String,String>，报表的原始参数<br>
	 * 22，sheets=Map<String,String>，key=模板sheet名，value=报表sheet名<br>
	 */
	public Map<String, Serializable> execute2(String code,Map<String, String> params);
	/**
	 * 分页返回报表的原始数据<br>
	 * 没有分页的报表也适用
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值<br>
	 * params中不需要包含PAGE_INDEX，包含了也会被忽略
	 * @param yield 用于控制下一次的行为，会被调用多次
	 */
	public void execute(String code,Map<String, String> params,ReportExecuteYield yield);
	
	/**
	 * 分页返回报表的原始数据<br>
	 * 没有分页的报表也适用
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值<br>
	 * params中不需要包含PAGE_INDEX，包含了也会被忽略
	 * @param yield 用于控制下一次的行为，会被调用多次，参数增加了总记录数
	 */
	public void execute(String code,Map<String, String> params,ReportExecuteYield3 yield);
	/**
	 * 分页返回报表的原始数据<br>
	 * 没有分页的报表也适用
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值<br>
	 * params中不需要包含PAGE_INDEX，包含了也会被忽略
	 * @param yield 用于控制下一次的行为，会被调用多次
	 */
	public void execute2(String code,Map<String, String> params,ReportExecuteYield2 yield);
	
	/**
	 * 分页返回报表的原始数据<br>
	 * 没有分页的报表也适用
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值<br>
	 * params中不需要包含PAGE_INDEX，包含了也会被忽略
	 * @param yield 用于控制下一次的行为，会被调用多次，参数增加了总记录数
	 */
	public void execute2(String code,Map<String, String> params,ReportExecuteYield4 yield);
	/**
	 * 导出text<br>
	 * 内容中的合并单元格会拆开，合并区域内的值均相同，二进制单元格（如chart）的值空，以\t分割列，以\r\n分割行
	 * 适用于不分页的报表，或分页的报表只导出第一页，或只导出指定页（params.put("PAGE_INDEX","页码")，前提是你确定页码不会超出页数）
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值
	 * @return 文件全路径，文件使用完后需要调用方删除或移走
	 */
	public String exportTxt(String code,Map<String, String> params);
	/**
	 * 分页导出text<br>
	 * 每页是单独的文件<br>
	 * 没有分页的报表也适用<br>
	 * 内容中的合并单元格会拆开，合并区域内的值均相同，二进制单元格（如chart）的值空，以\t分割列，以\r\n分割行<br>
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值<br>
	 * params中不需要包含PAGE_INDEX，包含了也会被忽略
	 * @param yield 用于控制下一次的行为，会被调用多次
	 */
	public void exportTxt(String code,Map<String, String> params,ReportExportYield yield);
	/**
	 * 导出excel<br>
	 * 适用于不分页的报表，或分页的报表只导出第一页，或只导出指定页（params.put("PAGE_INDEX","页码")，前提是你确定页码不会超出页数）
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值
	 * @return 文件全路径，文件使用完后需要调用方删除或移走
	 */
	public String exportXls(String code,Map<String, String> params);
	/**
	 * 分页导出excel<br>
	 * 每页是单独的文件<br>
	 * 没有分页的报表也适用<br>
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值<br>
	 * params中不需要包含PAGE_INDEX，包含了也会被忽略
	 * @param yield 用于控制下一次的行为，会被调用多次
	 */
	public void exportXls(String code,Map<String, String> params,ReportExportYield yield);
	/**
	 * 导出excel2003<br>
	 * 适用于不分页的报表，或分页的报表只导出第一页，或只导出指定页（params.put("PAGE_INDEX","页码")，前提是你确定页码不会超出页数）
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值
	 * @return 文件全路径，文件使用完后需要调用方删除或移走
	 */
	public String exportXls2003(String code,Map<String, String> params);
	/**
	 * 分页导出excel2003<br>
	 * 每页是单独的文件<br>
	 * 没有分页的报表也适用<br>
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值<br>
	 * params中不需要包含PAGE_INDEX，包含了也会被忽略
	 * @param yield 用于控制下一次的行为，会被调用多次
	 */
	public void exportXls2003(String code,Map<String, String> params,ReportExportYield yield);
	/**
	 * 导出word<br>
	 * 适用于不分页的报表，或分页的报表只导出第一页，或只导出指定页（params.put("PAGE_INDEX","页码")，前提是你确定页码不会超出页数）
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值
	 * @return 文件全路径，文件使用完后需要调用方删除或移走
	 */
	public String exportDoc(String code,Map<String, String> params);
	/**
	 * 分页导出word<br>
	 * 每页是单独的文件<br>
	 * 没有分页的报表也适用<br>
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值<br>
	 * params中不需要包含PAGE_INDEX，包含了也会被忽略
	 * @param yield 用于控制下一次的行为，会被调用多次
	 */
	public void exportDoc(String code,Map<String, String> params,ReportExportYield yield);
	/**
	 * 导出pdf<br>
	 * 适用于不分页的报表，或分页的报表只导出第一页，或只导出指定页（params.put("PAGE_INDEX","页码")，前提是你确定页码不会超出页数）
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值
	 * @return 文件全路径，文件使用完后需要调用方删除或移走
	 */
	public String exportPdf(String code,Map<String, String> params);
	/**
	 * 分页导出pdf<br>
	 * 每页是单独的文件<br>
	 * 没有分页的报表也适用<br>
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值<br>
	 * params中不需要包含PAGE_INDEX，包含了也会被忽略
	 * @param yield 用于控制下一次的行为，会被调用多次
	 */
	public void exportPdf(String code,Map<String, String> params,ReportExportYield yield);
	/**
	 * 导出png<br>
	 * 适用于不分页的报表，或分页的报表只导出第一页，或只导出指定页（params.put("PAGE_INDEX","页码")，前提是你确定页码不会超出页数）
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值
	 * @return 文件全路径，文件使用完后需要调用方删除或移走
	 */
	public String exportPng(String code,Map<String, String> params);
	/**
	 * 分页导出png<br>
	 * 每页是单独的文件<br>
	 * 没有分页的报表也适用<br>
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值<br>
	 * params中不需要包含PAGE_INDEX，包含了也会被忽略
	 * @param yield 用于控制下一次的行为，会被调用多次
	 */
	public void exportPng(String code,Map<String, String> params,ReportExportYield yield);
	/**
	 * 通用导出，支持内置格式和自定义格式<br>
	 * 适用于不分页的报表，或分页的报表只导出第一页，或只导出指定页（params.put("PAGE_INDEX","页码")，前提是你确定页码不会超出页数）
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值
	 * @param type 文件类型
	 * @return 文件全路径，文件使用完后需要调用方删除或移走
	 */
	public String export(String code,Map<String, String> params,int type);
	/**
	 * 通用分页导出，支持内置格式和自定义格式<br>
	 * 每页是单独的文件<br>
	 * 没有分页的报表也适用<br>
	 * @param code 报表编码
	 * @param params 报表需要的参数<br>
	 * 必须包含所有系统参数：SYS_REPORT_CODE,SYS_REPORT_NAME,SYS_USER_ID,SYS_USER_NAME，若不包含__p__的值，则使用p的值作为__p__的值<br>
	 * params中不需要包含PAGE_INDEX，包含了也会被忽略
	 * @param type 文件类型
	 * @param yield 用于控制下一次的行为，会被调用多次
	 */
	public void export(String code,Map<String, String> params,int type,ReportExportYield yield);
	/**
	 * 通用导出，支持内置格式和自定义格式<br>
	 * 此方法是基于已经执行完成的报表进行导出，不会重新执行
	 * @param report 报表对象，可以从execute方法的返回值（key=report）中获取
	 * @param type 文件类型
	 * @return 文件全路径，文件使用完后需要调用方删除或移走
	 */
	public String export(Serializable report,int type);
	
	/**
	 * 上传excel文件做为存根保存
	 * @param code 模板code
	 * @param params 模板参数
	 * @param stubFile 存根文件
	 */
	public void uploadStubFile(String code, Map<String, String> params, File stubFile);
	
	/**
	 * 获取模板高级选项里配置的模板名称规则和路径规则
	 * @param code
	 * @param params
	 * @return key为template_name表示模板名称规则，为template_path表示模板路径规则
	 */
	public Map<String,String> getTemplateNameAndPath(String code,Map<String, String> params);
	
	/**
	 * 根据参数查找唯一存根，找不到返回null，找得到返回存根对应的二维数组数据
	 * @param code
	 * @param paramMap
	 * @return
	 */
	public String[][] findStubByParams(String code, Map<String, String> paramMap);

	/**
	 * 
	 * @param code
	 * @param paramMap
	 * @param yield
	 */
	public void findStubByParams(String code, Map<String, String> paramMap, ReportExecuteYield yield);
}
